package company;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 租车骑绿岛
 * <p>
 * 部门组织绿岛骑行团建活动。租用公共双人自行车;每辆自行车最多坐两人;最大载重M。
 * 给出部门每个人的体重请问最多需要租用多少双人自行车。
 * <p>
 * 输入描述
 * 第一行两个数字m、n分别代表自行车限重;部门总人数。
 * 第二行n个数字代表每个人的体重体重都小于等于自行车限重m
 * 输出描述
 * 最小需要的双人自行车数量。
 * 题目解析
 * 本题需要最少的车辆即尽可能组合出重量小于等于m的两人组。
 * 首先我们可以将所有人按体重升序然后将最大体重和m比较若最大体重大于等于则这个人只能
 * 一人占一辆车车数量count然后将最大体重弹出继续将剩下体重中最大的和m比较，逻辑同上直到最大体重小于m时停止弹出。
 * <p>
 * 在剩余体重中我们利用双指针i指针指向最小体重j指针指向最大体重然后组合它们即arr[i]、arr[j]和m比较若小于等于m则说明这两个人可以共享一辆车车数量count然后ij--。如果arr[i]、arr[j]>m则说明两个人无法共享一辆车我们只能优先将这里车分配给较大体重的人此时车数量count然后j--。
 * 按上面逻辑移动双指针最后可能会出现两种情况
 * i > j 此情况下所有人均分配到了车因此可以直接输出count作为题解
 * i ==j    此情况下还有一个人未分配到车因此需要count为这个人单独分配一辆
 */
public class RentCar {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int totalWeight = sc.nextInt();
        int peoNum = sc.nextInt();
        /*List<Integer> list = new ArrayList<>();
        for (int i = 0; i < peoNum; i++) {
            list.add(sc.nextInt());
        }
        System.out.println(getResult(totalWeight, list));*/
        int[] list = new int[peoNum];
        for (int i = 0; i < peoNum; i++) {
            list[i] = sc.nextInt();
        }
        System.out.println(getResult(totalWeight, list));
    }

    /*public static int getResult(int totalWeight, List<Integer> list) {
        Collections.sort(list);

        // 先安排体重大于等自行车限制体重的自行车
        List<Integer> collect = list.stream().filter(it -> it >= totalWeight).collect(Collectors.toList());
        int count = collect.size();
        list.removeAll(collect);

        // 用双指针分配自行车
        int len = list.size();
        int left = 0;
        int right = len - 1;
        while (true) {
            if (len == 0) {
                break;
            }
            for (int i = 0; i < len; i++) {
                if (left < right) {
                    int leftNum = list.get(left);
                    int rightNum = list.get(right);
                    if (leftNum + rightNum == totalWeight) {
                        count++;
                        list.remove(left);
                        list.remove(right - 1);
                        len = list.size();
                        left = 0;
                        right = len - 1;
                        break;
                    }
                    if (list.get(left) + list.get(right) < totalWeight) {
                        left++;
                    }
                    if (list.get(left) + list.get(right) > totalWeight) {
                        if (left == 0) {
                            count++;
                            list.remove(right);
                            len = list.size();
                            left = 0;
                            right = len - 1;
                        } else {
                            count++;
                            list.remove(left - 1);
                            list.remove(right - 1);
                            len = list.size();
                            left = 0;
                            right = len - 1;
                        }
                        break;
                    }
                } else if (right == left) {
                    count++;
                    len = 0;
                    break;
                }
            }
        }
        return count;
    }*/

    public static int getResult(int totalWeight, int[] arr) {
        Arrays.sort(arr);
        int i =0;
        int j = arr.length-1;
        int count = 0;
        while(i<j) {
            if (arr[i]+arr[j] < totalWeight) {
                i++;
            }
            j--;
            count++;
        }
        if (i==j) {
            count++;
        }
        return count;
    }
}
